5.05. Условные операции
Условные операции
Программы редко выполняются линейно. Чаще всего они должны принимать решения на основе данных. Для этого в C# используются условные операции — конструкции, которые позволяют выполнять разные блоки кода в зависимости от условия.
Самый базовый способ ветвления — оператор if. Он проверяет условие и, если оно истинно (true), выполняет блок кода.
Синтаксис:
if (условие)
{
// код, если условие истинно
}
else if (другое_условие)
{
// код, если первое ложно, а второе — истинно
}
else
{
// код, если все условия ложны
}
Пример:
int age = 20;
if (age < 13)
{
Console.WriteLine("Ребёнок");
}
else if (age < 18)
{
Console.WriteLine("Подросток");
}
else
{
Console.WriteLine("Взрослый");
}
else if может быть сколько угодно.
else — необязательный, но должен быть последним.
Если блок состоит из одной строки, фигурные скобки можно опустить (но не рекомендуется):
if (age > 18)
Console.WriteLine("Совершеннолетний");
switch используется, когда нужно выбрать один из нескольких вариантов на основе значения переменной.
Синтаксис:
switch (выражение)
{
case значение1:
// код
break;
case значение2:
// код
break;
default:
// код по умолчанию
break;
}
Пример:
string day = "понедельник";
switch (day)
{
case "понедельник":
Console.WriteLine("Начало недели");
break;
case "пятница":
Console.WriteLine("Почти выходные");
break;
case "суббота":
case "воскресенье":
Console.WriteLine("Выходные!");
break;
default:
Console.WriteLine("Обычный день");
break;
}
case должен завершаться break, return, throw или goto (иначе ошибка компиляции — "fall-through" запрещён).
Можно группировать case (как в субботу/воскресенье).
default — необязательный, но рекомендуется.
Начиная с C# 8, появилось выражение switch (switch expression) — более лаконичный и функциональный способ записи switch. Он возвращает значение, как тернарный оператор, и использует стрелку =>.
Это очень симпатичный способ заменить большое количество if/else:
var result = выражение switch
{
значение1 => результат1,
значение2 => результат2,
_ => значение_по_умолчанию
};
Здесь «_» — это discard, аналог default.
Пример:
string day = "пятница";
string mood = day switch
{
"понедельник" => "Устал...",
"пятница" => "Йеее, выходные!",
"суббота" => "Отдыхаю",
"воскресенье" => "Грущу перед понедельником",
_ => "Нормально"
};
Console.WriteLine(mood); // "Йеее, выходные!"
switch и switch expression поддерживают pattern matching — проверку типа, значения и структуры.
object value = "Hello";
string type = value switch
{
null => "Пусто",
int => "Целое число",
string s when s.Length > 5 => "Длинная строка",
string => "Короткая строка",
_ => "Неизвестный тип"
};
Здесь:
string s when s.Length > 5— проверка типа и условия;string— просто проверка типа;int— тоже проверка типа.
Тернарный оператор (? : ) – сокращённая форма условия if-else. Это самая короткая форма ветвления. Используется, когда нужно выбрать одно из двух значений.
string result = (score >= 50) ? "Прошёл" : "Не прошёл";
Синтаксис стандартный:
условие ? значение_если_истина : значение_если_ложь
Можно вкладывать! Но не злоупотребляйте, а то будет нечитаемо:
string category = age < 13 ? "Ребёнок" :
age < 18 ? "Подросток" : "Взрослый";
Такой код читается плохо. Лучше использовать if или switch expression.